package model.database;

import java.io.File;

import model.entity.Caixa;
import model.entity.Consulta;
import model.entity.Dentista;
import model.entity.EntradaCaixa;
import model.entity.Material;
import model.entity.Paciente;
import model.entity.PlanoTratamento;
import model.entity.Procedimento;
import model.entity.SaidaCaixa;
import model.entity.Secretaria;
import model.entity.TipoPagamento;
import model.entity.Usuario;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

/**
 * Factory para criação de conexão com o BD
 * 
 * @author Maitê Balhester
 * @created Mar 11, 2012
 */
@SuppressWarnings("deprecation")
public class HibernateConnectionFactory {

	private static SessionFactory sessionFactory;

	private static Session s;

	/**
	 * Inicia a session factory do Hibernate
	 * 
	 * @param file
	 *            hibernate.cfg.xml
	 * @return {@link SessionFactory}
	 */
	public static void setSessionFactory(File file) {
		AnnotationConfiguration conf = new AnnotationConfiguration()
				.configure(file);
		addMappedClass(conf);
		sessionFactory = conf.buildSessionFactory();
	}

	/**
	 * Adiciona as classes mapeadas
	 * 
	 * @param conf
	 *            configura��o
	 */
	private static void addMappedClass(AnnotationConfiguration conf) {
		conf.addPackage("entity");
		conf.addAnnotatedClass(Paciente.class);
		conf.addAnnotatedClass(Usuario.class);
		conf.addAnnotatedClass(Dentista.class);
		conf.addAnnotatedClass(Secretaria.class);
		conf.addAnnotatedClass(Material.class);
		conf.addAnnotatedClass(Procedimento.class);
		conf.addAnnotatedClass(Consulta.class);
		conf.addAnnotatedClass(Caixa.class);
		conf.addAnnotatedClass(EntradaCaixa.class);
		conf.addAnnotatedClass(SaidaCaixa.class);
		conf.addAnnotatedClass(TipoPagamento.class);
		conf.addAnnotatedClass(PlanoTratamento.class);
	}

	/**
	 * Abre uma session
	 */
	public static Session openSession() {
		if (sessionFactory == null) {
			String dir = System.getProperty("user.dir");
			// XXX Maitê: Vai funcionar para o Linux deste jeito... para
			// Windows tem
			// que colocar \\
			String fileName = dir + File.separator + "src" + File.separator
					+ "model" + File.separator + "resources"
					+ File.separator + "hibernate.cfg.xml";

			setSessionFactory(new File(fileName));
		}

		s = sessionFactory.openSession();
		return s;
	}

	public static Session getSession() {
		if (s != null && s.isOpen())
			return s;
		else
			return openSession();
	}

	/**
	 * Fecha a conexão
	 * 
	 * @param session
	 *            session
	 */
	public static void closeSession(Session session) {
		session.close();
	}

}
